From: Maxim Ermilov Date: Fri, 15 Oct 2010 04:53:34 +0000 (+0400) Subject: boxpointer: add animateDisappear/animateAppear methods X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~9640 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=4d18d54d9d4d8f52aee545f5bfc743f2e06d45d4;p=gnome-shell.git boxpointer: add animateDisappear/animateAppear methods https://bugzilla.gnome.org/show_bug.cgi?id=624900 --- diff --git a/js/ui/boxpointer.js b/js/ui/boxpointer.js index d6bd0d0c8..68cea44eb 100644 --- a/js/ui/boxpointer.js +++ b/js/ui/boxpointer.js @@ -5,6 +5,10 @@ const Lang = imports.lang; const St = imports.gi.St; const Shell = imports.gi.Shell; +const Tweener = imports.ui.tweener; + +const POPUP_ANIMATION_TIME = 0.15; + /** * BoxPointer: * @side: A St.Side type; currently only St.Side.TOP is implemented @@ -38,6 +42,80 @@ BoxPointer.prototype = { this.bin.raise(this._border); }, + animateAppear: function(onComplete) { + let x = this.actor.x; + let y = this.actor.y; + let themeNode = this.actor.get_theme_node(); + let [found, rise] = themeNode.get_length('-arrow-rise', false); + if (!found) + rise = 0; + + this.actor.opacity = 0; + this.actor.show(); + + switch (this._arrowSide) { + case St.Side.TOP: + this.actor.y -= rise; + break; + case St.Side.BOTTOM: + this.actor.y += rise; + break; + case St.Side.LEFT: + this.actor.x -= rise; + break; + case St.Side.RIGHT: + this.actor.x += rise; + break; + } + + Tweener.addTween(this.actor, { opacity: 255, + x: x, + y: y, + transition: "linear", + onComplete: onComplete, + time: POPUP_ANIMATION_TIME }); + }, + + animateDisappear: function(onComplete) { + let x = this.actor.x; + let y = this.actor.y; + let originalX = this.actor.x; + let originalY = this.actor.y; + let themeNode = this.actor.get_theme_node(); + let [found, rise] = themeNode.get_length('-arrow-rise', false); + if (!found) + rise = 0; + + switch (this._arrowSide) { + case St.Side.TOP: + y += rise; + break; + case St.Side.BOTTOM: + y -= rise; + break; + case St.Side.LEFT: + x += rise; + break; + case St.Side.RIGHT: + x -= rise; + break; + } + + Tweener.addTween(this.actor, { opacity: 0, + x: x, + y: y, + transition: "linear", + time: POPUP_ANIMATION_TIME, + onComplete: Lang.bind(this, function () { + this.actor.hide(); + this.actor.x = originalX; + this.actor.y = originalY; + if (onComplete) + onComplete(); + }) + }); + }, + _adjustAllocationForArrow: function(isWidth, alloc) { let themeNode = this.actor.get_theme_node(); let found, borderWidth, base, rise; diff --git a/js/ui/popupMenu.js b/js/ui/popupMenu.js index 7e60fe821..60f9011b1 100644 --- a/js/ui/popupMenu.js +++ b/js/ui/popupMenu.js @@ -16,8 +16,6 @@ const Tweener = imports.ui.tweener; const Gettext = imports.gettext.domain('gnome-shell'); const _ = Gettext.gettext; -const POPUP_ANIMATION_TIME = 0.1; - function Switch() { this._init.apply(this, arguments); } @@ -639,11 +637,8 @@ PopupMenu.prototype = { this.actor.y = Math.floor(menuY); // Now show it - this.actor.opacity = 0; this.actor.reactive = true; - Tweener.addTween(this.actor, { opacity: 255, - transition: "easeOutQuad", - time: POPUP_ANIMATION_TIME }); + this._boxPointer.animateAppear(); this.isOpen = true; this.emit('open-state-changed', true); }, @@ -657,11 +652,7 @@ PopupMenu.prototype = { if (this._activeMenuItem) this._activeMenuItem.setActive(false); this.actor.reactive = false; - Tweener.addTween(this.actor, { opacity: 0, - transition: "easeOutQuad", - time: POPUP_ANIMATION_TIME, - onComplete: Lang.bind(this, function () { this.actor.hide(); })}); - + this._boxPointer.animateDisappear(); this.isOpen = false; this.emit('open-state-changed', false); },